/*
 * Copyright 2008-2023 dexian.vip. All rights reserved.
 * Support: http://www.dexian.vip
 * License: http://www.dexian.vip/license
 */

package vip.dexian.common.utils;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * 集合操作
 *
 * @author 挺好的 2023年06月01日 18:33
 */
public final class CollectionUtils {

    private CollectionUtils () {

    }

    /**
     * 如果list为空，将创建一个新的ArrayList
     *
     * @param list
     *         集合
     * @param <T>
     *
     * @return 如果list==null，返回一个新的集合。否则返回原来的
     */
    public static <T> List <T> emptyIfNull (List <T> list) {

        if (list == null) {
            return new ArrayList <>();
        }
        return list;
    }

    /**
     * 去重复。isRemoveLeZero == true, 则会删除<=0的元素。
     *
     * @param list
     *         待去重的数据
     * @param isEmptyToNull
     *         当list为空时，是返回null还是一个空集合
     * @param isRemoveLeZero
     *         是否移除 <= 0 的元素
     *
     * @return 去重后的结果。如果list is
     * empty（{@link org.apache.commons.collections4.CollectionUtils#isEmpty(java.util.Collection)}），返回空集合（
     * {@link java.util.Collections#emptyList()}）
     */
    public static List <Long> distinct (List <Long> list, boolean isEmptyToNull, boolean isRemoveLeZero) {
        if (org.apache.commons.collections4.CollectionUtils.isEmpty(list)) {
            return isEmptyToNull ? null : Collections.emptyList();
        }

        List <Long> values;

        if (isRemoveLeZero) {
            values = list.stream().filter(element -> element != null && element > 0).distinct().toList();
        } else {
            values = list.stream().filter(Objects::nonNull).distinct().toList();
        }

        if (org.apache.commons.collections4.CollectionUtils.isEmpty(values)) {
            return isEmptyToNull ? null : Collections.emptyList();
        }

        return values;
    }

    /**
     * 去重复。如果元素<=0，则去除。
     *
     * @param ids
     *         待去重的数据
     *
     * @return 去重后的结果。如果ids is empty（{@link org.apache.commons.lang3.ArrayUtils#isEmpty(long[])}），返回空集合。
     */
    public static List <Long> distinct (Long... ids) {

        if (ArrayUtils.isEmpty(ids)) {
            return Collections.emptyList();
        }

        List <Long> idList = Arrays.asList(ids);
        return distinct(idList);
    }

    /**
     * 去重复。如果元素<=0，则去除
     *
     * @param list
     *         待去重的数据
     *
     * @return 去重后的结果。如果list is
     * empty（{@link org.apache.commons.collections4.CollectionUtils#isEmpty(java.util.Collection)}），返回空集合（
     * {@link java.util.Collections#emptyList()}）
     */
    public static List <Long> distinct (List <Long> list) {
        return distinct(list, false, true);
    }


    /**
     * 去重复。isRemoveLeZero == true, 则会删除<=0的元素。
     *
     * @param list
     *         待去重的数据
     * @param isRemoveLeZero
     *         是否移除 <= 0 的元素
     *
     * @return 去重后的结果。如果list is
     * empty（{@link org.apache.commons.collections4.CollectionUtils#isEmpty(java.util.Collection)}），返回空集合（
     * {@link java.util.Collections#emptyList()}）
     */
    public static List <Long> distinct (List <Long> list, boolean isRemoveLeZero) {
        return distinct(list, false, isRemoveLeZero);
    }

    /**
     * 对String进行去重
     *
     * @param list
     *         待去重的列表
     *
     * @return 去重后的结果。如果list is
     * empty（{@link org.apache.commons.collections4.CollectionUtils#isEmpty(java.util.Collection)}），返回空集合（
     * {@link java.util.Collections#emptyList()}）
     */
    public static List <String> distinctStringList (List <String> list) {

        if (org.apache.commons.collections4.CollectionUtils.isEmpty(list)) {
            return Collections.emptyList();
        }
        return list.stream().filter(StringUtils::isNotEmpty).distinct().toList();
    }

    /**
     * 数组转换为list
     *
     * @param array
     *         数组
     *
     * @return {@link java.util.ArrayList}
     */
    public static List <String> arrayToList (String[] array) {

        if (ArrayUtils.isEmpty(array)) {
            return Collections.emptyList();
        }

        List <String> list = new ArrayList <>(array.length);

        for (String value : array) {
            if (StringUtils.isNotEmpty(value)) {
                list.add(value);
            }
        }

        return list;
    }

    /**
     * list转换为字符串。
     *
     * @param list
     *         待转换的列表
     * @param delimiter
     *         分隔符
     *
     * @return 转换后的字符串
     */
    public static String listToString (List <String> list, String delimiter) {
        Assert.notEmpty(list, "list is required");
        Assert.hasText(delimiter, "delimiter is required");

        return StringUtils.join(list, delimiter);
    }
}
